import pandas as pd
from pandas import Series, DataFrame

import fileUtil

'''
某列是否存在在另一列
'''


def drop_cols(df, *cols) -> DataFrame:
    print("删除列:", cols)
    df = df.drop(columns=list(cols), axis=1, errors='ignore')
    return df


def 是否存在(s1: Series, s2: Series):
    b = s1.isin(s2)
    return b.map({True: "是", False: "否"})


# 新增统计行
def 新增统计行(df: DataFrame, name='总计'):
    # 计算除第一列外其他列的和
    total_values = df.iloc[:, 1:].sum()
    # 创建一个包含总计信息的新行
    new_row = pd.Series([name] + total_values.tolist(), index=df.columns)
    # 将新行添加到 DataFrame 的末尾
    df = pd.concat([df, pd.DataFrame([new_row])], ignore_index=True)
    return df


'''
    对某列指定值替换
    PdUtil.replace(olt, '分公司', ['石景', '门头'], '石门')
    将分公司为['石景', '门头']的替换成'石门'
'''


def mask_if_in(df, column, in_set, replacement):
    df[column] = df[column].mask(df[column].isin(in_set), replacement)


# 设置数字格式
def set_number_format(writer, start_col, end_col):
    # 获取工作簿和工作表对象
    workbook = writer.book
    worksheet = writer.sheets['Sheet1']
    # 创建一个数字格式对象
    number_format = workbook.add_format({'num_format': '0.00'})
    # 应用数字格式到数据列
    worksheet.set_column(start_col, end_col, None, number_format, options={'hidden': False})


def get_writer(path, data):
    writer = pd.ExcelWriter(path, engine='xlsxwriter')

    # 将DataFrame写入Excel文件的工作表中（这里默认写入Sheet1）
    data.to_excel(writer, sheet_name='Sheet1', index=False)

    # 获取工作簿对象
    workbook = writer.book
    # 创建格式对象，设置字体为微软雅黑，字号为9
    format_font = workbook.add_format()
    format_font.set_font_name('微软雅黑')
    format_font.set_font_size(9)

    # 对整个工作表应用字体格式（这里可以根据实际需求灵活调整应用范围，比如特定列、行等）
    worksheet = writer.sheets['Sheet1']
    worksheet.set_column(0, data.shape[1] - 1, None, format_font)
    return writer


# 统计某列出现两次以上的个数
def count_values_appearing_more_than_twice(df, column):
    value_counts = df[column].value_counts()
    return (value_counts > 1).sum()


'''
根据表头进行重新排序
column_types 表头顺序
column_types=['a','b']
head=['a1','b1',]]
'''


def sort_head(df, column_types, first):
    # 提取每个类型对应的列名
    sorted_columns = [first]
    for col_type in column_types:
        # 筛选出包含当前类型的列名
        cols = [col for col in df.columns if col_type in col]
        sorted_columns.extend(cols)

    # 按照新的列名顺序重新排列数据框
    df = df[sorted_columns]
    return df


'''
输出两列的包含关系
'''


def 两列交集():
    df = pd.read_excel('/temp/temp.xlsx', dtype=str)
    a = df.columns[0]
    b = df.columns[1]
    # 假设两列名为 'a' 和 'b'
    df[a] = df[a].drop_duplicates().reset_index(drop=True)
    df[b] = df[b].drop_duplicates().reset_index(drop=True)
    col_a = df[a]
    col_b = df[b]

    # 计算 a 有 b 没有的元素
    only_in_a = col_a[~col_a.isin(col_b)].reset_index(drop=True)
    # 计算 b 有 a 没有的元素
    only_in_b = col_b[~col_b.isin(col_a)].reset_index(drop=True)
    # 计算 a 和 b 的交集
    intersection = col_a[col_a.isin(col_b)].reset_index(drop=True)

    # 添加新列到 DataFrame
    df[f'{a}有{b}没有'] = only_in_a
    df[f'{b}有{a}没有'] = only_in_b
    df[f'{a}和{b}的交集'] = intersection

    df.to_excel('/temp/t.xlsx', index=False)


def to_csv(path, df):
    fileUtil.mkdir(path)
    df.to_csv(path, index=False)


'''
    筛选每个账号最新时间的行

    :param df: 输入的 DataFrame
    :param account_column: 账号列的名称
    :param time_column: 时间列的名称
    :return: 筛选后的 DataFrame
'''


def filter_latest_time(df, col, time_column):
    # 确保时间列是日期时间类型
    df[time_column] = pd.to_datetime(df[time_column], format='mixed')
    # 按账号分组，然后选择每个组中时间列的最大值对应的行
    latest_rows = df.loc[df.groupby(col)[time_column].idxmax()]
    return latest_rows
